//这里边相当于请求的工具，用来定制请求的实例

//导入axios: npm install axios
import axios from 'axios';

//导入Message消息提示
import { ElMessage } from 'element-plus';

//定义一个变量，记录公共的前缀，baseURL
// const baseURL = 'http://localhost:8080';
// 这里的'/api'只是给后台访问的请求路径添加一个标识
const baseURL = '/api';

/*  axios.create()方法，把baseURL作为参数传入，
    该方法返回一个请求的实例 instance,
    以后发送请求时，就不用axios.get了，
    直接用instance.get就可以 */
const instance = axios.create({ baseURL })

/* axios提供的拦截器,
    在请求或响应，被then或catch处理前拦截
    也就是在请求发出之前，有一个请求拦截器
    或在响应到达之前，有一个响应拦截器 */


//导入Pinia
import { useTokenStore } from '@/stores/token';
//添加请求拦截器
instance.interceptors.request.use(
    (config) => {
        //请求前的回调
        const tokenStore = useTokenStore();
        //在pinia中定义的响应式数据,都不需要.value
        if (tokenStore.token) {
            config.headers.Authorization = tokenStore.token;
        }
        return config
    },
    (err) => {
        //请求错误的回调
        Promise.reject(err);
    }
)

/* 由于模块加载的顺序，不能这样导入
    import { useRoute } from 'vue-router';
    const router = useRoute(); 
*/
//这样导入就能用了
import router from '@/router'

//添加响应拦截器(这个拦截器本身就是异步的)
instance.interceptors.response.use(
    //成功的回调
    result => {
        let code = result.data.code;
        //判断业务状态码
        if (code === 0 || code === 200) {
            return result.data;
        }

        //操作失败
        ElMessage.error(result.data.msg ? result.data.msg : '服务异常');

        //异步操作的状态转换为失败
        return Promise.reject(result.data);
    },
    //失败的回调
    err => {
        //判断响应状态码，若为401，则说明未登录，提示请登录，并跳转到登录页面
        if(err.response.status === 401){
            ElMessage.error('请先登录');
            router.push('/login');
        }else{
            ElMessage.error('服务异常');
        }

        //异步的状态转化成失败的状态
        return Promise.reject(err);
    }
)

//把请求的实例 instance 导出,供其他地方调用
export default instance;
